﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using tea.DB;

namespace tea.BL
{
    public class BL파일
    {
        // 파일첨부 유형 구분
        public const int 파일첨부_게시글첨부파일 = 1;
        public const int 파일첨부_게시글이미지파일 = 2;
        public const int 파일첨부_이력서사진 = 3;
        public const int 파일첨부_이력서학위증 = 4;
        public const int 파일첨부_채용내용이미지 = 5;

        public static bool 수정권한검사(DBDataContext db, long 대상ID, int 대상유형)
        {
            if (대상유형 == 파일첨부_게시글첨부파일) {
                var 글 = db.게시글.FirstOrDefault(p => p.ID == 대상ID);
                if (글 == null) return false;
                return BL게시판.글수정권한(글);
            }
            return true;
        }

        public static void 불필요한파일삭제()
        {
            using (var db = new DBDataContext()) {
                불필요한이력서파일삭제(db, 파일첨부_이력서사진);
                불필요한이력서파일삭제(db, 파일첨부_이력서학위증);
                첨부데이터가없는파일삭제(db);
                db.SubmitChanges();
            }
        }

        public static void 첨부데이터가없는파일삭제(DBDataContext db)
        {
            // 정보: 여러 파일첨부 객체들이 파일 하나를 공유할 수 있기 때문에, 파일첨부 객체가 없는 파일을 삭제하는 형태로 구현함.
            // 게시글을 저장하기전, 이미지 파일부터 업로드 하므로, 파일첨부 객체 없이 파일이 먼저 올라옴. 이 경우 [임시] = true. 이 것들은 3시간의 여유를 두고 파일을 삭제함.
            var 목록 = db.파일.Where(f => f.임시 == false || f.생성일 < DateTime.Now.AddHours(-3))
                              .Where(f => db.파일첨부.Any(a => a.파일ID == f.ID) == false);
            db.파일.DeleteAllOnSubmit(목록);
        }

        private static void 불필요한이력서파일삭제(DBDataContext db, int 대상유형)
        {
            var 최종첨부목록 = db.파일첨부.Where(p => p.대상유형 == 대상유형).GroupBy(p => p.대상ID).Where(p => p.Count() > 1).Select(p => new { 대상ID = p.Key, ID = p.Max(q => q.ID) }).ToList();
            foreach (var 최종첨부 in 최종첨부목록) {
                var 삭제목록 = db.파일첨부.Where(p => p.대상ID == 최종첨부.대상ID && p.대상유형 == 대상유형 && p.ID < 최종첨부.ID);
                db.파일.DeleteAllOnSubmit(삭제목록.Select(p => p.파일));
                db.파일첨부.DeleteAllOnSubmit(삭제목록);
            }
        }

        public static void 이미지첨부정보_저장(DBDataContext db, string 본문, long 대상ID, int 대상유형)
        {
            db.파일첨부.DeleteAllOnSubmit(db.파일첨부.Where(p => p.대상ID == 대상ID && p.대상유형 == 대상유형));

            Regex 찾을패턴 = new Regex(@"/Image/Download/([0-9]+)");
            var 찾은목록 = 찾을패턴.Matches(본문);
            foreach (Match match in 찾은목록) {
                var id = int.Parse(match.Groups[1].Value);
                var 파일 = db.파일.FirstOrDefault(p => p.ID == id);
                if (파일 == null) continue;
                db.파일첨부.InsertOnSubmit(new 파일첨부 { 파일ID = 파일.ID, 대상ID = 대상ID, 대상유형 = 대상유형, 크기 = 파일.크기, 파일명 = 파일.파일명 });
            }
        }

    }
}